home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / radiance / simplerd.lha / simplerad / FinalFTP / Light / draw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-21  |  6.4 KB  |  251 lines

  1. /**********************************************************************/
  2. /* draw.c :                                                           */
  3. /*                                                                    */
  4. /* Scene drawing, and hemicube computations on SGI framebuffer        */
  5. /*                                                                    */
  6. /* Copyright (C) 1992, Bernard Kwok                                   */
  7. /* All rights reserved.                                               */
  8. /* Revision 1.0                                                       */
  9. /* May, 1992                                                          */
  10. /**********************************************************************/
  11. #include <stdio.h>
  12. #ifdef IRIS4D
  13. #include <gl/gl.h>
  14. #endif
  15. #include "geo.h"
  16. #include "io.h"
  17. #include "struct.h"
  18. #include "rad.h"
  19.  
  20. extern RadParams ReadLog;
  21. extern Hemicube hemicube;
  22. extern OptionType Option;
  23. int showmesh = 0;
  24. long HCWid; /* window to use of hc */
  25. long DisplWid; /* window to use for display */
  26. long CurWid;
  27. float zmax;
  28. #ifdef IRIS4D
  29. Matrix Identity = {
  30.   1,0,0,0,
  31.   0,1,0,0,
  32.   0,0,1,0,
  33.   0,0,0,1
  34. };
  35. #endif
  36.  
  37. void Reset_Buffers();
  38. void Begin_DrawHC();
  39. void End_DrawHC();
  40. void Draw_Polygon();
  41. void Draw_PolygonRGB();
  42. void Begin_DrawDispl();
  43. void End_DrawDispl();
  44. void Create_Display_Buffer();
  45. void Create_Item_Buffer();
  46. void CleanUpBuffers();
  47.  
  48. #ifndef IRIS4D
  49. void Reset_Buffers() {}
  50. void Begin_DrawHC() {}
  51. void End_DrawHC() {}
  52. void Draw_Polygon() {}
  53. void Draw_PolygonRGB() {}
  54. void Begin_DrawDispl() {}
  55. void End_DrawDispl() {}
  56. void Create_Display_Buffer() {}
  57. void Create_Item_Buffer() {}
  58. void CleanUpBuffers() {}
  59. #else
  60.  
  61. /**********************************************************************/
  62. /* Clear z and frame buffers                                          */
  63. /**********************************************************************/
  64. void Reset_Buffers(fvalue, zvalue)
  65.      unsigned long fvalue;
  66.      float zvalue;
  67. {  czclear(fvalue, zvalue); }
  68.  
  69. /**********************************************************************/
  70. /* Set up item buffer, and view */
  71. /**********************************************************************/
  72. void Begin_DrawHC(view, background)
  73.      Camera view;
  74.      unsigned long background;
  75. {
  76.   
  77.   winset(HCWid);
  78.   if (Option.debug) {
  79.     CurWid = winget();
  80.     printf("+ Current window: %d\n", CurWid);
  81.     printf("+ Eye: view.fovy = %d, near = %g, far = %g\n",
  82.        view.fovy, view.near, view.far);
  83.     printf("  lookfrom: %g,%g,%g; lookat: %g,%g,%g\n",
  84.        view.lookfrom.x, view.lookfrom.y, view.lookfrom.z, 
  85.        view.lookat.x, view.lookat.y, view.lookat.z);
  86.     printf("  bank: %g\n", view.bank);
  87.   }
  88.  
  89.   pushmatrix();
  90.   perspective((int)view.fovy*10,1,view.near, view.far);
  91.   lookat(view.lookfrom.x, view.lookfrom.y, view.lookfrom.z,
  92.      view.lookat.x, view.lookat.y, view.lookat.z, 0);
  93.   Reset_Buffers(background,zmax);
  94. }
  95.  
  96. /**********************************************************************/
  97. /* Read the frame buffer to hemicube buffer */
  98. /**********************************************************************/
  99. void End_DrawHC()
  100. {
  101.   long pixels_read;
  102.   unsigned long temp[13000];
  103.   unsigned long *pb;
  104.   int i;
  105.   int hsize = ReadLog.hemicubeRes;
  106.  
  107.   winset(HCWid);
  108.   popmatrix();
  109.   for (i=0;i<13000;i++) temp[i] = kBackgroundItem;
  110.  
  111.   readsource(SRC_FRONT);
  112.   pixels_read = lrectread(1,1,hemicube.view.xRes,hemicube.view.yRes,temp);
  113.   pb = hemicube.view.buffer;
  114.   for(i=0;i<(hsize*hsize);i++, pb++) 
  115.     *pb = temp[i];  
  116. }
  117.  
  118. /**********************************************************************/
  119. /* Draw patch */
  120. /**********************************************************************/
  121. void Draw_Polygon(nPts,pts, normal, p_colour)
  122.      int nPts;
  123.      Vector pts[MAX_PATCH_VTX];
  124.      Vector *normal;
  125.      unsigned long p_colour;
  126. {
  127.   int i;
  128.   float fpoint[3];
  129.  
  130.   shademodel(FLAT);
  131.   cpack(p_colour);
  132.  
  133.   bgnpolygon();
  134.   for(i=0;i<nPts;i++) {
  135.     fpoint[0] = pts[i].x; fpoint[1] = pts[i].y; fpoint[2] = pts[i].z;
  136.     v3f(fpoint); 
  137.   }
  138.   endpolygon();
  139. }
  140.  
  141. /**********************************************************************/
  142. void Draw_PolygonRGB(nPts,pts, normal, p_colour)
  143.      int nPts;
  144.      Vector pts[MAX_PATCH_VTX];
  145.      Vector *normal;
  146.      Colour p_colour[4];
  147. {
  148.   int i;
  149.   float fpoint[3];
  150.   float fnorm[3];
  151.   float fcolour[3];
  152.  
  153.   fnorm[0] = normal->x; fnorm[1] = normal->y; fnorm[2] = normal->z;
  154.  
  155.   shademodel(GOURAUD);
  156.   
  157.   if (showmesh)
  158.     bgnline();
  159.   else
  160.     bgnpolygon(); 
  161.  
  162.   for(i=0;i<nPts;i++) {
  163.     fpoint[0] = pts[i].x; 
  164.     fpoint[1] = pts[i].y; 
  165.     fpoint[2] = pts[i].z;
  166.     fcolour[0] = p_colour[i].r; 
  167.     fcolour[1] = p_colour[i].g; 
  168.     fcolour[2] = p_colour[i].b;
  169.  
  170.     c3f(fcolour);
  171.     /* n3f(fnorm); */
  172.     v3f(fpoint); 
  173.   }
  174.  
  175.   if (showmesh)
  176.     endline();
  177.   else
  178.     endpolygon();
  179. }
  180.  
  181. /**********************************************************************/
  182. void Begin_DrawDispl(view, background)
  183.      Camera view;
  184.      unsigned char background;
  185. {
  186.   winset(DisplWid);
  187.   pushmatrix();
  188.   perspective(view.fovy*10,1,view.near, view.far);
  189.   lookat(view.lookfrom.x, view.lookfrom.y, view.lookfrom.z,
  190.      view.lookat.x, view.lookat.y, view.lookat.z, view.bank);
  191.   Reset_Buffers(0x000000,zmax);
  192. }
  193.  
  194. /**********************************************************************/
  195. void End_DrawDispl()
  196. {
  197.   winset(DisplWid); 
  198.   popmatrix();
  199.   swapbuffers();
  200. }
  201.  
  202. /**********************************************************************/
  203. void Create_Display_Buffer(sizex, sizey)
  204.      int sizex, sizey;
  205. {
  206.   prefsize(sizex,sizey);
  207.   DisplWid = winopen("PR Radiosity");
  208.   
  209.   zbuffer(TRUE);
  210.   zmax = getgdesc(GD_ZMAX);
  211.   doublebuffer();
  212.   RGBmode();
  213.   mmode(MVIEWING);
  214.   loadmatrix(Identity);
  215.   Reset_Buffers(0xff000f, zmax);
  216.   gconfig();
  217. }
  218.  
  219. /**********************************************************************/
  220. /* Set up zbuffer, and item_buffer (part of frame-buffer)             */
  221. /**********************************************************************/
  222. void Create_Item_Buffer(buff_sizex, buff_sizey)
  223.      int buff_sizex, buff_sizey;
  224. {
  225.   /* Setup frame buffer area of size buff_size as item buffer */
  226.   prefsize(buff_sizex,buff_sizey);
  227.   keepaspect(1,1);
  228.   HCWid = winopen("FF");
  229.  
  230.   zmax = getgdesc(GD_ZMAX);
  231.   RGBmode();
  232.   mmode(MVIEWING);
  233.     zbuffer(TRUE);
  234.   Reset_Buffers(kBackgroundItem,zmax);
  235.   readsource(SRC_AUTO);
  236.   loadmatrix(Identity);
  237.   gconfig();
  238. }
  239.  
  240.  
  241. /**********************************************************************/
  242. void CleanUpBuffers()
  243. {
  244.   sleep(10);
  245.   if (Option.ff_raytrace == 0)
  246.     winclose(HCWid);
  247.   winclose(DisplWid);
  248. }
  249.  
  250. #endif /* IRIS4D */
  251.